﻿// 定义一个名为 "Custom RP/Unlit" 的 Shader
// 通常用于自定义渲染管线（Custom Render Pipeline），比如你自己的 SRP 项目
// "Unlit" 表示这是一个不进行光照计算的 Shader，适合用于纯色、贴图或特效对象
Shader "Custom RP/Unlit"
{
    // ======================
    // Properties（属性块）
    // 这些属性会显示在 Unity Inspector 中，用于材质面板调节
    // ======================
    Properties
    {
        // _BaseMap：基础纹理，类型为 2D 贴图，默认值为 "white"（纯白纹理）
        _BaseMap("Texture", 2D) = "white" {}

        // _BaseColor：基础颜色，类型为 Color，默认为白色 (1,1,1,1)
        _BaseColor("Color", Color) = (1.0, 1.0, 1.0, 1.0)

        // _Cutoff：Alpha 裁剪阈值，范围 0~1，默认 0.5
        // 用于控制哪些像素会被丢弃（Alpha < Cutoff 的部分会被剔除）
        _Cutoff ("Alpha Cutoff", Range(0.0, 1.0)) = 0.5

        // _Clipping：是否启用 Alpha 裁剪功能
        // 这是一个布尔型 Toggle，实际在 Shader 内部会编译为宏 _CLIPPING
        // Float 类型是因为 Shader Feature 需要接收 0 或 1
        [Toggle(_CLIPPING)] _Clipping ("Alpha Clipping", Float) = 0

        // 下面是渲染状态的配置选项，可以通过材质面板选择不同的混合和深度写入方式

        // _SrcBlend：源混合因子（Src Blend），控制源颜色的混合方式
        // 可选值如 One, Zero, SrcAlpha, etc.，通过枚举方式在 Inspector 中选择
        [Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend ("Src Blend", Float) = 1
        // _DstBlend：目标混合因子（Dst Blend），控制目标颜色的混合方式
        [Enum(UnityEngine.Rendering.BlendMode)] _DstBlend ("Dst Blend", Float) = 0

        // _ZWrite：是否开启深度写入（ZWrite）
        // Off = 0，On = 1；控制物体是否写入深度缓冲，影响遮挡关系
        [Enum(Off, 0, On, 1)] _ZWrite ("Z Write", Float) = 1
    }

    // ======================
    // SubShader（子着色器）
    // 一个 Shader 可以包含多个 SubShader，Unity 会按顺序尝试使用第一个兼容的
    // ======================
    SubShader
    {
        // ======================
        // Pass（渲染通道）
        // 一个 SubShader 可包含多个 Pass，每个 Pass 代表一次完整的渲染流程
        // 这里只有一个 Pass
        // ======================
        Pass
        {
            // 设置该 Pass 的混合模式，使用材质中定义的 _SrcBlend 和 _DstBlend
            Blend [_SrcBlend] [_DstBlend]

            // 设置该 Pass 是否写入深度缓冲，使用 _ZWrite 设置
            ZWrite [_ZWrite]

            // ======================
            // HLSLPROGRAM ... ENDHLSL
            // 使用 HLSL 编写着色器代码，这是 Unity SRP / URP 的标准写法
            // ======================
            HLSLPROGRAM
            // 启用 Shader Feature，根据 _Clipping 是否为 1 来决定是否编译裁剪相关代码
            // 如果材质中 _Clipping = 1，则会启用 _CLIPPING 宏，编译裁剪逻辑
            #pragma shader_feature _CLIPPING

            // 启用 GPU Instancing 支持，允许批量渲染多个相同 Mesh（使用 MaterialPropertyBlock）
            #pragma multi_compile_instancing

            // 指定顶点着色器入口函数为 UnlitPassVertex
            #pragma vertex UnlitPassVertex

            // 指定片段着色器入口函数为 UnlitPassFragment
            #pragma fragment UnlitPassFragment

            // 引入该 Pass 使用的 HLSL 代码文件（通常放在同一目录或 Include 路径下）
            // 这里是 "UnlitPass.hlsl"，应该包含顶点和片段着色器的具体实现
            #include "UnlitPass.hlsl"

            // HLSL 着色器代码结束
            ENDHLSL
        }
    }
}